#ifndef __NEWTYPES_H__
#define __NEWTYPES_H__

// Random Number seed
#include <boost/random/linear_congruential.hpp>
#include <boost/random/uniform_int.hpp>
#include <boost/random/uniform_real.hpp>
#include <boost/random/variate_generator.hpp>
#include <boost/unordered_map.hpp>

typedef boost::minstd_rand base_generator_type;
extern base_generator_type generator;


// Experimental Conditions. Refer pp 228 (section 4.2) N.P. Hummon
enum EXPT_COND {
            EC_NONE = 0,
            EC_UA_UD, // Unilateral Add, Unilateral Delete
            EC_UA_MD, // Unilateral Add, Multual Delete
            EC_MA_UD, // Mutual Add, Unilateral Delete
            EC_MA_MD  // Mutual Add, Mutual Delete
};


// The possible (final) network structurs
enum NTWK_STRUCT {  NS_NULL = 0,
                    NS_STAR,
                    NS_SHARED,
                    NS_COMPLETE,
                    NS_NEAR_NULL,
                    NS_NEAR_STAR,
                    NS_NEAR_SHARED,
                    NS_NEAR_COMPLETE,
                    NS_K_PARTITE,
                    NS_K_PARTITE_COMPLETE,
                    NS_TYPE_SIZE
};

enum ACTOR_STATE { AS_NONE = 0,
                    AS_PASSIVE,
                    AS_ACTIVE
};


// structure for holding the input parameters.
class Param
{
    public:
     int N;             // the number of actors
     double c;          // cost
     double delta;      // benefit
     double density;    // for creating the number of initial ties
     int expt;           // experiment. See the enumeration EXPERIMENTAL_CONDITIONS
     int n_repeat;
     int n_iterations;
     int n_idle_terminate;
     int random_seed;
     int dump;


     Param() : N(5), c(0.5), delta(0.45), density(.1), expt(1),
               n_repeat(1), n_iterations(100), n_idle_terminate(1),
               random_seed(42), dump(-1)
    { }
};

struct Edge
{
    int srcVertex;
    int destVertex;

    Edge(int src, int dest) : srcVertex(src), destVertex(dest)
    {
    }
};

typedef boost::unordered_map<int, Edge> EdgeMap;


#endif
